package com.hugang.designmode.templatefunction;

/**
 * 抽象类的应用：模板方法设计模式
 * 用于某些方法的实现方式已经确定，而其他某些方法的实现方式不确定的场景。
 * 例如：Template类的spendTime()方法用于计算某段代码的执行时间，而code()方法
 * 的具体实现则由Template的子类确定，可以是计算1000以内质数的算法，也可以是排序算法等等
 *
 * @author hg
 * @date 2020/6/12 15:28
 */
public class TemplateFunctionTest {

    public static void main(String[] args) {
        Template template = new SubClass();
        template.spendTime();
    }
}

abstract class Template {

    /**
     * 计算代码执行花费时间
     */
    public final void spendTime() {
        long start = System.currentTimeMillis();
        code();//不确定的部分
        long end = System.currentTimeMillis();
        System.out.println("代码执行花费的时间为：" + (end - start) + "ms");
    }

    public abstract void code();
}

class SubClass extends Template {

    /**
     * 计算1000以内的质数
     */
    @Override
    public void code() {
        for (int i = 2; i <= 1000000; i++) {
            boolean flag = true;
            for (int j = 2; j < Math.sqrt(i); j++) {
                if (i % j == 0) {
                    flag = false;
                    break;
                }
            }
            if (flag) {
                System.out.println(i);
            }
        }
    }
}
